<?php
/**
 * @category 	Common.php
 * @author 		Sung Hoon, Cho (akdddnet@gmail.com)
 * @since		2008. 07. 31.
 * @license		BSD License
 * @version		0.1
 * 
 * - 문자나 숫자 형인지 검사할때는 is_함수보다는 ctype_함수를 사용하기를 권장합니다.
 * 
 * 수정내역	
 * 		1. 2010. 12. 30
 * 			- 닷넷 영향을 받았던 코딩 체계를 자바 환경으로 수정함.
 */

	/**
	 * 자주 사용되는 함수 모음.
	 */
 	class Common
 	{ 		
 		/**
 		 * 생성자
 		 */
		function __construct()
		{
			
		}
		
		public static $yearsec = 31536000;
		public static $weeksec = 604800;
		public static $daysec = 86400;
		public static $hoursec = 3600;
		public static $minsec = 60;
		
		
		/**
		 * @param string $name : 쿠키명
		 * @param string $value : 쿠키값
		 * @param boolean $override : 덮어씌우기
		 * @param string $expire : 기간
		 * @param string $path : 경로
		 * @param string $domain : 도메인 
		 */
		public static function setCookie($name, $value, $override=false, $expire=0, $path='/', $domain=NULL) {
			if($domain==NULL) {
				$domain = $_SERVER['SERVER_NAME'];
			}
			
			if(strpos($domain,'.')===false) {
				$domain=NULL;
			}
			
			
			$cookie = Common::getCookie($name);
			if($cookie !== false) {
				if(!$override) {
					$value = $cookie.$value;
				}
			}
			
			// expire 값이 없으면 하루 기준으로..
			if(!strcmp($expire, 0)) {
				$expire = time()+ (86400 * 60);
			}

			return setcookie($name, Common::rc4encrypt($value), $expire, $path, $domain);	
		}
		
		
		public static function getCookie($name) {
			$cookie = $_COOKIE[$name];
			
			// 등록된 쿠키값이 있다면 디코딩 시켜서 리턴
			if(!Common::isNullOrEmpty($cookie)) {
				return Common::rc4decrypt($cookie);
			} else {
				return false;
			}
		}
		
		
		public static function getCookieInStr($cookiename, $str) {
			$cookie = Common::getCookie($cookiename);
			
			// 쿠키값이 있다면..
			if($cookie !== false) {
				if(strpos($cookie, $str) !== FALSE) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		}
		
		
		/**
		* rc4encrypt
		*
		* @todo Finish documenting this function
		*
		* @param string $data Data to encrypt
		* @return string The now encrypted data
		*/
		static function rc4encrypt($str) {
			$password = 'rkskekfkakqktkdk';
			return Common::endecrypt($password, $str, '');
		}
		
		/**
		 * rc4decrypt
		 *
		 * @todo Finish documenting this function
		 *
		 * @param string $data Data to decrypt
		 * @return string The now decrypted data
		 */
		static function rc4decrypt($str) {
			$password = 'rkskekfkakqktkdk';
			return Common::endecrypt($password, $str, 'de');
		}
		
		/**
		* Based on a class by Mukul Sabharwal [mukulsabharwal @ yahoo.com]
		*
		* @todo Finish documenting this function
		*
		* @param string $pwd The password to use when encrypting or decrypting
		* @param string $data The data to be decrypted/encrypted
		* @param string $case Either 'de' for decrypt or '' for encrypt
		* @return string
		*/
		static function endecrypt ($pwd, $data, $case) {
		
			if ($case == 'de') {
				$data = urldecode($data);
			}
		
			$key[] = '';
			$box[] = '';
			$temp_swap = '';
			$pwd_length = 0;
		
			$pwd_length = strlen($pwd);
		
			for ($i = 0; $i <= 255; $i++) {
				$key[$i] = ord(substr($pwd, ($i % $pwd_length), 1));
				$box[$i] = $i;
			}
		
			$x = 0;
		
			for ($i = 0; $i <= 255; $i++) {
				$x = ($x + $box[$i] + $key[$i]) % 256;
				$temp_swap = $box[$i];
				$box[$i] = $box[$x];
				$box[$x] = $temp_swap;
			}
		
			$temp = '';
			$k = '';
		
			$cipherby = '';
			$cipher = '';
		
			$a = 0;
			$j = 0;
		
			for ($i = 0; $i < strlen($data); $i++) {
				$a = ($a + 1) % 256;
				$j = ($j + $box[$a]) % 256;
				$temp = $box[$a];
				$box[$a] = $box[$j];
				$box[$j] = $temp;
				$k = $box[(($box[$a] + $box[$j]) % 256)];
				$cipherby = ord(substr($data, $i, 1)) ^ $k;
				$cipher .= chr($cipherby);
			}
		
			if ($case == 'de') {
				$cipher = urldecode(urlencode($cipher));
			} else {
				$cipher = urlencode($cipher);
			}
		
			return $cipher;
		}
		
		/**
		 * 문자열의 첫번째 값이 전달된 파라메터값과 일치하는지 확인합니다.
		 * 
		 * @param string $value
		 * @param string $com
		 * 
		 * @return boolean $rtn
		 */
		public static function startWith($value, $com)
		{
			$rtn = 1;
			if(!self::isNullOrEmpty($value))
			{
				$rtn = !strcasecmp(substr($value, 0, 1), $com);	
			}
			
			return $rtn;
		}
		
		/**
		 * 전달된 파라메터가 빈값이면 default값으로 리턴시킵니다.
		 * 
		 * @param string $name : 체크할 값
		 * @param string $default : $name이 빈값이면 대처할 값
		 * 
		 * @return string;
		 */
		public static function getRequest($name, $default='')
		{
			if(self::IsNullOrEmpty($name))
				return $default;
			else return $name;
		}

		/**
		 * 텍스트를 지정된 수로 잘라서 말줄임표시와 함께 리턴
		 *
		 * @param $strOriginal : 원본텍스트
		 * @param $intCutSize : 화면에 표시될 문자수
		 * @param $blAddOpt : 말줄임 표시 추가 여부
		 * @deprecated 다음 프로젝트 때 삭제될 예정입니다.
		 * @return string
		 */
		public static function getSubString($strOriginal, $intCutSize, $strSuffix='...')
		{
			$oln=$ln=strlen($strOriginal);
			$flg=$i=0;
			$tmp="";
			if($ln>$intCutSize&&$intCutSize>0) $ln=$intCutSize;
			do
			{
				if(ord($strOriginal[$i])>127) $flg=!$flg;
				else $flg=0;
				$tmp.=$strOriginal[$i];
				$i++;
				if($i>=$ln&&$flg==0) break;
			} while(1);
			if($oln>$i) $tmp.=$strSuffix;
			return $tmp;
		}
		
		
		/**
		 * 문자열을 지정된 길이 만큼 잘라서 리턴해줍니다.
		 * 
		 * 
		 * @param string $str
		 * @param int $len
		 * @param string $suffix
		 * @return string
		 */
		public static function getSubStr($str, $len, $suffix=null) {
			$return = mb_substr($str, 0, $len, 'UTF-8');
			
			if(!Common::isNullOrEmpty($return)) {
				$return .= $suffix;
			}
				
			return $return;
		}
		
		/**
		 * 문자열을 지정된 바이트 만큼 잘라서 리턴해줍니다.
		 * 
		 * @param string $str
		 * @param int $byte
		 * @param string $suffix
		 * @return string
		 */
		public static function getStrCut($str, $byte, $suffix=null) {
			$return = mb_strcut ($str, 0, $byte, 'UTF-8');
			
			if(!Common::isNullOrEmpty($return)) {
				$return .= $suffix;
			}
			
			return $return;
		}

		/**
		 * 문자열이 빈값인지 확인 (빈값이면 true)
		 * @param $str : 문자열
		 * @return string
		 */
		public static function isNullOrEmpty($str)
		{
			//$str = trim($str);
			if(!isset($str)||$str==NULL||$str=='') return true;
			else return false;
		}
		
		
		/**
		 * 문자열이 빈값이면 특정 문자열을 리턴해줍니다.
		 * 
		 * @param string $str
		 * @param string $return
		 */
		public static function getNullToString($str, $return = "&nbsp;") {
			if(Common::isNullOrEmpty($str)) {
				return $return;
			} else {
				return $str;
			}
		}

		
		/**
		 * implode 변경 
		 * implode 할 때 빈값이 넘어올경우 "" 값으로 리턴시킴
		 * 그 이외에는 implode함수와 역활이 같음.
		 * @param $value implode시킬 문자열
		 * @param $glue 문자열을 합칠때 사용되는 구분자
		 * @return string
		 */
		public static function getImplodeString($value, $glue=',')
		{
			$rtn = '';
			if(!is_null($value))
			{
				$rtn = implode($glue, $value);
			}
			
			return $rtn;
		}
		
		/**
		 * 파일 사이즈를 사용자가 보기 편하도록 변환해서 반환 합니다.
		 * @param int $size : 사이즈
		 * @return string $rtn
		 */
		public static function getFileSize($size=0)
		{
			$rtn = 0;
			
			if(is_numeric($size))
			{
				if($size <= 0)
					$rtn = '0 Byte';
				else if($size<1024) 
					$rtn = $size.' Byte';
				else if($size>=1024 && $size<1048576) 
					$rtn = sprintf('%0.1f KB', $size/1024);
				else if($size>=1048576 && $size<1073741824) 
					$rtn = sprintf('%0.2f MB',$size/1048576);
				else 
					$rtn = sprintf('%0.2f GB',$size/1073741824);
			}
			else 
				$rtn = '파라메터가 숫자형이 아닙니다. 숫자형으로 전달해주시기 바랍니다.';
				
			return $rtn; 
		}
		
		/**
		 * 문자열을 byte단위로 변환해서 리턴합니다.
		 * 한글 : 3byte, 기타 : 1byte 
		 * 
		 * @param string $str : 문자열
		 * @return int $rtn : byte
		 */
		public static function getByte($str)
		{
			$rtn = 0;
			
			for($i=0,$maxi=strlen($str); $i<$maxi; $i++) 
			{
			 	$rtn ++;
			}
			
			return $rtn;
		}
		
		/**
		 * print_r로 출력할 내용을 string형으로 리턴시킵니다.
		 * 
		 * @param array $array
		 * @return string;
		 */
		public static function getPrintRToString($array)
		{
			ob_start(); 
	        print_r($array); 
	        $str = ob_get_contents(); 
	        ob_end_clean();
	        
	        return $str;
		}
		
		
		public static function print_r($array, $return=false)
		{
			$str = "<pre>";
			$str .= self::GetPrintRToString($array);
			$str .= "</pre>";
			
			if($return)
				return $str;
			else 
				echo $str;
		}
		
		
		/**
		 * 문자열에 "/" 가 2개 들어있는 경우 이를 1개로 변환해서 리턴합니다.
		 * 예) http://site.com//index.php -> http://site.com/index.php
		 * 참고 : CodeIgniter
		 * 
		 * @param string 
		 * @return string
		 */
		public static function getReduceDoubleSlashes($str)
		{
			return preg_replace("#([^:])//+#", "\\1/", $str);
		}
		
		
		/**
		 * 랜덤적인 문자, 숫자 등을 지정된 길이만큼 생성합니다.
		 * 참고 : CodeIgniter
		 * 
		 * @param string $type : alnum
		 * 						 numeric
		 *                       nozero
		 *                       unique
		 * @return string
		 */
		public static function getRandomString($type = 'default', $len = 0)
		{				
			$str = '';
				
			switch($type)
			{
				default :
				case 'default'	:
				case 'number'	:
				case 'nozero'	:
				case 'user'		:
					// 랜덤으로 추출할 문자열 길이가 1보다 작을 경우에는 8자리로 수정
					if(intval($len) < 1)
						$len = 8;
			
					switch ($type)
					{
						default :
						case 'default'	:	
							$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
							break;
						case 'number'	:	
							$pool = '0123456789';
							break;
						case 'nozero'	:	
							$pool = '123456789';
							break;
						case 'user' :
							$poll = "";
							break;
					}

					for ($i=0; $i < $len; $i++)
						$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
					
					break;
				case 'unique' :
					$str = md5(uniqid(mt_rand()));
					
					// 문자열 자리수 지정을 한 경우에는 
					if($len > 0)
						$str = substr($str, 0, $len);
				  break;
			}
			
			return $str;
		}

		/**
		 * 새글인지 확인합니다.
		 * @param datetime $time	: 현재시간
		 * @param datetime $date	: 글 등록시간
		 * @param int $newday		: 새글 표시 시간
		 */
 		public static function isNew($time, $date, $newday=7) {
			return strtotime($date) > ($time - (3600*(24*$newday)));
		}
		
		
		/**
		 * 숫자로 된 요일값을 한글로 변환해서 리턴합니다.
		 * @param int $wday
		 */
		public static function getDayString($wday) {
			$rtn = "";
			switch($wday) {
				case 1 :
					$rtn = "월";
				break;
				case 2 :
					$rtn = "화";
				break;
				case 3 :
					$rtn = "수";
				break;
				case 4 :
					$rtn = "목";
				break;
				case 5 :
					$rtn = "금";
				break;
				case 6 :
					$rtn = "토";
				break;
				default :
					$rtn = "일";
				break;
			}
			
			return $rtn."요일";
		}
		
		
		/**
		 * 
		 * value값으로 전달된 값이 빈값일 경우 전달된 null 파라메터값으로 변경해서 리턴해줍니다.
		 * @param string $value
		 * @param string $null
		 */
		public static function getParam($value, $null="") {
			if(Common::isNullOrEmpty($value))
				return $null;
			else $value;
		}
		
		
		
		/**
		 * 위치가 변경될 가망성이 큼 사용하지 마세요
		 * Enter description here ...
		 * @param unknown_type $agent
		 */
		public static function isIPhoneApps() {
			$agent = $_SERVER['HTTP_USER_AGENT'];
			
			if(self::isMobile($agent)) {
				if (preg_match('/iPhone/', $agent) && !preg_match('/Safari/', $agent))
					return true;
			}
			
			return false;
		}
		
		
		/**
		 * ajax 요청 판별하기
		 * ajax로 호출된 경우 true를 리턴해줍니다.
		 * 
		 * @return boolean $isAjax
		 */
		public static function isAjax() {
			return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
		}
		
		
		/**
		 * 고유한 문자열
		 * 
		 */
		public static function getUUID() {
			return md5(uniqid());
		}
		
		
		/**
		 * IP 주소 알아오기
		 * 
		 */
		public static function getRealIP() {
			if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
				// check ip from share internet
				$ip=$_SERVER['HTTP_CLIENT_IP'];
			} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
				// to check ip is pass from proxy
				$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
			} else {
				$ip=$_SERVER['REMOTE_ADDR'];
			}
			
			return $ip;
		}
		
		
		/**
		 * 현재 접속 중인 기기 알아오기
		 * Enter description here ...
		 */
		public static function getDivice() {
			$useragent = $_SERVER['HTTP_USER_AGENT'];
			
			//mobile detection PHP direct copy from open source detectmobilebrowser.com
			$phonesregex = '/android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i';
			$modelsregex = '/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i';
			
			$divice = 'default';
			
			// 모바일
			if (preg_match($phonesregex,$useragent) || preg_match($modelsregex,substr($useragent, 0, 4))){
				$divice = 'mobile';
			}
			
			// 타블릿
			$tabletregex = '/Tablet browser|iPad|iProd|GT-P1000|GT-I9000|SHW-M180S|SGH-T849|SCH-I800|Build\/ERE27|sholest/i';
			if (preg_match($tabletregex, $useragent)) {
				$divice = 'tablet';
			}
			
			// 익스 6 이하
			if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== false) {
				$divice = 'legacy';
			}
			
			return $divice;
		}
		
		
		public static function setOption($value, $text) {
			$option = new stdClass;
			$option->value = $value;
			$option->text = $text;
			
			return $option;
		}
		
 	}
?>
